import os
import subprocess

from gxl_ai_utils.utils import utils_file

time_now = utils_file.do_get_now_time()
input_shards_path, replace_dir, dataname, local_root_dir, thread_num = utils_file.do_get_commandline_param(5, ["input_shards_path", "replace_dir","dataname", "remote_root_dir", "thread_num"])
utils_file.logging_info("Start uploading shards to remote server，start time: {}")
utils_file.logging_info(f"input_shards_path: {input_shards_path}")
utils_file.logging_info(f"replace_dir: {replace_dir}")
utils_file.logging_info(f"dataname: {dataname}")
utils_file.logging_info(f"local_root_dir: {local_root_dir}")
utils_file.logging_info(f"thread_num: {thread_num}")

def do_sync_copy_file_download(input_file_path, output_file_path, password, username, remote_host):
    """
    rsync -avrP ....
    :param input_file_path:
    :param output_file_path:
    :param password:
    :param username:
    :param remote_host:
    :return:
    """
    output_dir = os.path.dirname(output_file_path)
    utils_file.makedir_sil(output_dir)
    rsync_command = [
        'sshpass', '-p', password,  # 使用 sshpass 提供密码
        'rsync', '-avrP',  # rsync 参数：-a（归档），-v（详细），-r（递归），-P（部分传输和进度）
        f'{username}@{remote_host}:{input_file_path}',
        f'{output_file_path}',  # 本地目标路径
    ]
    # 执行 rsync 命令
    try:
        subprocess.run(rsync_command, check=True)
        print("文件同步完成！")
    except subprocess.CalledProcessError as e:
        print(f"rsync 命令执行失败: {e}")
    except FileNotFoundError as e:
        print(f"命令未找到: {e}")
    except Exception as e:
        print(f"发生错误: {e}")
do_sync_copy_file_download(input_shards_path,f"{local_root_dir}/{dataname}/shards_list.txt",
                                    username="root",
                                    password="Fy!mATB@QE",
                                    remote_host="139.210.101.41",
                                    )
fake_file = utils_file.do_replace_str_for_file_and_return_new_file(f"{local_root_dir}/{dataname}/shards_list.txt",replace_dir,f"{local_root_dir}/{dataname}")
utils_file.copy_file(fake_file,f"{local_root_dir}/{dataname}/shards_list2.txt")


def do_sync_files_download_dir(remote_dir, password, username, remote_host,local_dir):
    """
    sync比scp更好用，功能相似的前体下sync支持断点续传
    remote_dir  local_dir 都需要后面带/，表示只穿内容，不穿该目录本身。
    :param file_list_path: 包含文件列表的文件路径
    :param password: 远程主机的 SSH 密码
    :param username: 远程主机的用户名
    :param remote_host: 远程主机的 IP 地址或主机名
    :param local_directory: 本地存储文件的目标目录
    :param local_dir
    :return:
    """
    # 构造 rsync 命令
    if not remote_dir.endswith('/'):
        remote_dir += '/'
    if not local_dir.endswith('/'):
        local_dir += '/'
    rsync_command = [
        'sshpass', '-p', password,  # 使用 sshpass 提供密码
        'rsync', '-avrP',  # rsync 参数：-a（归档），-v（详细），-r（递归），-P（部分传输和进度）
        f"{username}@{remote_host}:{remote_dir}",
        f'{local_dir}',  # 远程源路径
    ]
    try:
        print(f'开始执行：{" ".join(rsync_command)}')
        subprocess.run(rsync_command, check=True)
        print("文件同步完成！")
    except subprocess.CalledProcessError as e:
        print(f"rsync 命令执行失败: {e}")
    except FileNotFoundError as e:
        print(f"命令未找到: {e}")
    except Exception as e:
        print(f"发生错误: {e}")

do_sync_files_download_dir(
    username="root",
    password="Fy!mATB@QE",
    remote_host="139.210.101.41",
    local_dir=f"{local_root_dir}/{dataname}",
    remote_dir=os.path.dirname(input_shards_path)
)
esl_time = utils_file.do_get_elapsed_time(time_now)
utils_file.logging_info(f"End uploading shards to remote server，Total time: {esl_time} s")